#pragma once
#include <unistd.h>
#include "util.hpp"
#include "data.hpp"
#include "config.hpp"
// remove 目录不存在
extern cloud::DataManager *data;

namespace cloud
{
    class HotManager
    {
    public:
        HotManager()
        {
            _hot_time = Config::getInstance().getHotTime();
            _back_dir = Config::getInstance().getBackDir();
            _pack_dir = Config::getInstance().getPackDir();

            UtilFile backDir(_back_dir);
            UtilFile packDir(_pack_dir);

            backDir.createDirectory();
            packDir.createDirectory();
        }

        void runModule()
        {
            while (true) // 真的需要循环吗？
            {
                UtilFile backdir(_back_dir);
                std::vector<std::string> files;
                backdir.sanDirectory(files);

                for (int i = 0; i < files.size(); i++)
                {
                    // 如果是热点文件则直接跳过
                    if (HotJudge(files[i]))
                    {
                        continue;
                    }

                    BackupInfo info;
                    // 防止出现有文件但没有文件数据的情况
                    if (!data->getOneByReal(files[i], &info))
                    {
                        info = BackupInfo(files[i]);
                        data->insert(info);
                    }
                    UtilFile file(files[i]);
                    file.compress(info.pack_path);
                    file.removeFile();

                    info.pack_flag = true;
                    data->update(info);
                }
                usleep(1000);
            }
        }

    private:
        bool HotJudge(const std::string &filename)
        {
            UtilFile file(filename);
            time_t atime = file.lastAcctime();
            time_t ctime = time(nullptr);

            if (ctime - atime < _hot_time)
                return true;

            return false;
        }

    private:
        time_t _hot_time;
        std::string _back_dir;
        std::string _pack_dir;
    };
}